俗話說的好,『如果說我看得比別人更遠,那是因為我站在巨人的肩膀上。』,在 opensouce 裡面,也是一樣,我們可以提供自己寫好的 package 給別人用,也能引入別人所寫的 package。
雖然上面那句諺語,本意好像是牛頓在諷刺人用的,不過在這邊還是拿來做引用。
先看下面範例
package main
import (
"fmt"
)
func main() {
fmt.Println("Hello, playground")
}
https://play.golang.org/p/HmnNoBf0p1z
上面範例來說,這是一個 golang 標準的 hello wrold 寫法,大家應該有看到上面 import 這個 keyword,這句話意思就是引入 package,在這邊這個範例是引入 fmt 這個 package。
在做下面這個範例前,請大家先在自己的 local 的開發環境 下指令
go get github.com/syhlion/simplenum
這是一個簡易的數字四捨五入套件。這句指令的意思就是把它 get 回來,這樣你後續才能 import 跟 build ...
這邊可以回去前面看第二章-如何安裝環境,那邊有個人開發目錄範例。應該可以看到
github.com/syhlion/simlenum
路徑。
後面章節會介紹,該如何使用 golang vender 相關機制。
下面這個範例來示範 import 外部 package
package main
import (
"github.com/syhlion/simplenum"
)
func main() {
fmt.Println(simplenum.Round(1.1354, 2))
}
這個範例因為引入外部 package 所以 go playground 不能執行,故不提供連結。
由上面可以看到,go 支援 git 的 namespace 協定,所以它 import 路徑也依照你的 git namesapce 下去命名。這樣就完成套件的引入
設計 package 很簡單,我們先看下面範例。
package math
func privateAdd(a int, b int) (c int) {
c = a + b
return
}
func Add(a int, b int) (c int) {
c = a + b
retrun
}
這個範例因為是設計 package 所以 go playground 不能執行,故不提供連結。
這樣子就完成了,一個非常基礎的 math package,它有提供 Add 方法。只要把它推上 github、gitlab...,就能像上面一樣,讓大家用 go get 的引入你的 pacage
golang 有一個很有趣的設計,它並沒有「顯示」的宣告 public、private,它的變數、func,可存取範圍是以 package 為單位,也就是同一個 package 下,並沒有區分 public、private,那不同 package 間要如何區分 public、private呢? 答案很簡單就是用首字的大小寫來做辨識,只要首字大寫,golang complie,就會把它視為 public ,外部 package 也都能存取,小寫就是反之。
這樣來看,上面那個例子 privateAdd ,在外部套件中是存取不到的,如果硬要存取,則會噴 undefined
的錯誤,在這邊上,就可以藉由 public、private,來做設計,保護自己的 package 一些比較危險的操作可以封裝起來。